package cn.csc.module.order.service.item;

import cn.csc.framework.common.pojo.PageResult;
import cn.csc.module.order.api.item.dto.OrderItemRespDTO;
import cn.csc.module.order.controller.admin.item.vo.*;
import cn.csc.module.order.controller.admin.order.vo.OrderReqVO;
import cn.csc.module.order.controller.admin.order.vo.OrderUpdateDeliveryReqVO;
import cn.csc.module.order.controller.app.order.vo.AppOrderItemCreateReqVO;
import cn.csc.module.order.controller.app.vo.OrderItemReqVO;
import cn.csc.module.order.dal.dataobject.item.OrderItemDO;
import com.baomidou.mybatisplus.extension.service.IService;

import javax.validation.Valid;
import java.math.BigInteger;
import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * 订单项 Service 接口
 *
 * @author liuchuang
 */
public interface OrderItemService extends IService<OrderItemDO> {

    /**
     * 创建订单项
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    BigInteger createItem(@Valid OrderItemCreateReqVO createReqVO);

    /**
     * 更新订单项
     *
     * @param updateReqVO 更新信息
     */
    void updateItem(@Valid OrderItemUpdateReqVO updateReqVO);

    /**
     * 删除订单项
     *
     * @param id 编号
     */
    void deleteItem(BigInteger id);

    /**
     * 获得订单项
     *
     * @param id 编号
     * @return 订单项
     */
    OrderItemDO getItem(BigInteger id);

    /**
     * 获得订单项列表
     *
     * @param ids 编号
     * @return 订单项列表
     */
    List<OrderItemDO> getItemList(Collection<BigInteger> ids);

    /**
     * 获得订单项分页
     *
     * @param pageReqVO 分页查询
     * @return 订单项分页
     */
    PageResult<OrderItemDO> getItemPage(OrderItemPageReqVO pageReqVO);

    /**
     * 获得订单项列表, 用于 Excel 导出
     *
     * @param exportReqVO 查询条件
     * @return 订单项列表
     */
    List<OrderItemDO> getItemList(OrderItemExportReqVO exportReqVO);

    /**
     * 获得订单项根据订单id
     *
     * @param orderId 编号
     * @return 订单项
     */
    List<OrderItemDO> getItemByOrderId(BigInteger orderId);
    /**
     * 获得购物车产品数据
     *
     * @param userId 用户
     * @return 商家信息
     */
    List<BigInteger> getItemByUserId(BigInteger userId,BigInteger orderId);
    /**
     * 获得购物车产品数据
     *
     * @param userId 用户
     * @return 产品信息列表
     */
    List<OrderItemDO> getItemByUserIdAndShopId(BigInteger userId,BigInteger shopId);


    List<OrderItemDO> getByOrderIdAndShopId(BigInteger orderId,BigInteger shopId);


    /**
     * 获得购物车订单项列表是否为空
     *
     * @param reqVO
     * @return 订单项
     */
    OrderItemDO getItemOne(OrderItemReqVO reqVO);

    /**
     * 更新订单项
     *
     * @param updateReqVO 更新信息
     */
    void updateBatch(List<OrderUpdateDeliveryReqVO> updateReqVO);

    /**
     * 更新子项的订单状态
     * @param orderIds
     *
     */
    void updateOrderStatus(List<BigInteger> orderIds, Integer orderStatus);
    /**
     * 查询订单有多少个商家id
     * @param orderId
     * @return
     */
    List<BigInteger> getShopIdByOrderId(BigInteger orderId);
    /**
     * 获得订单详情订单子项列表
     *
     * @param userId 用户
     * @return 产品信息列表
     */
    List<OrderItemDO> getItemByUserIdAndShopIdAndOrderId(BigInteger userId,BigInteger shopId,BigInteger orderId);
    /**
     * 查询系统自动收货的订单
     *
     * @param orderReqVO
     * @return 订单信息列表
     */
    List<OrderItemDO> getListByDeliveryTime(OrderReqVO orderReqVO);

    /**
     * 确认收货/
     * @param orderItemDO
     * @return
     */
    Integer updateOrderStatus(OrderItemDO orderItemDO);
    /**
     * 后台管理-订单管理获得订单信息分页,包含订单子项
     *
     * @param pageReqVO 分页查询
     * @return 订单信息分页
     */
    PageResult<OrderWithItemPageRespVO> selectOrderItemsPage(OrderWithItemPageReqVO pageReqVO);
    /**
     * 获得购物车产品数据
     *
     * @param reqVO
     * @return d订单项信息列表
     */
    List<OrderItemDO> getItemList(OrderItemReqVO reqVO);
    /**
     * 将订单改为已支付状态
     * @param orderIds 订单ids
     */
    Integer updateByToPaySuccess(List<BigInteger> orderIds);
    /**
     * 获得订单信息列表, 用于 Excel 导出
     *
     * @param pageVO 查询条件
     * @return 订单信息列表
     */
    List<OrderItemBaseVO> getExportList(OrderWithItemPageReqVO pageVO);
    /**
     * 获得订单项列表,根据状态
     *
     * @param orderIds 订单Id
     * @return 订单项列表
     */
    List<OrderItemDO> getItemListByOrderId(List<BigInteger> orderIds,Integer orderStatus,BigInteger shopId);
    /**
     * 获得订单项列表,根据订单Id
     *
     * @param orderIds 订单Id
     * @return 订单项列表
     */
    List<OrderItemDO> getItemListByOrderId(List<BigInteger> orderIds);

    /**
     * 将订单的购物卡金额更新
     * @param appOrderItemCreateReqVOs 订单ids
     */
    Boolean updateByCardPayAmount(List<AppOrderItemCreateReqVO> appOrderItemCreateReqVOs);

    /**
     * 获得订单项根据订单id
     *
     * @param orderIds 编号
     * @return 订单项
     */
    Map<BigInteger,List<OrderItemRespDTO>> getItemByOrderIds(List<BigInteger> orderIds);
}
